import { delCache } from "#server/utils/context"; import { z } from "zod"; import { validate } from "#server/utils/validation"; import { updateCard, getCardById, CardTypes } from "../../service/card"; const updateSchema = z.object({ type: z.enum(CardTypes).optional(), title: z.string().min(1, "标题不能为空").max(60, "标题不能超过 60 字").optional(), description: z.string().max(200, "描述不能超过 200 字").nullable().optional(), aspectRatio: z.number().min(0).max(99).nullable().optional(), categoryId: z.string().nullable().optional(), images: z .array( z.object({ url: z.string().min(1, "图片地址不能为空").max(500), sortOrder: z.number().int().optional(), }), ) .nullable() .optional(), tagIds: z.array(z.number().int().positive()).nullable().optional(), }); export default defineWrappedResponseHandler(async (event) => { const idParam = getRouterParam(event, "id"); if (!idParam) return R.throwError(400, "缺少卡片 ID", null); const id = parseInt(idParam); if (isNaN(id)) return R.throwError(400, "卡片 ID 格式不正确", null); const body = await readBody(event); const data = validate(updateSchema, body); const existing = await getCardById(id); if (!existing) return R.throwError(404, "卡片不存在", null); const updated = await updateCard(id, data); await delCache(`card:${id}`); await delCache("categories:tree"); return R.success(updated); });